# -*- coding: utf-8 -*-
# 作者公众号：程序员张先生
import base64
import time

from gooey import Gooey, GooeyParser

import xiao_tool_server


@Gooey(
    richtext_controls=True,  # 打开终端对颜色支持
    program_name="XIAO_TOOL工具箱",  # 程序名称
    encoding="utf-8",  # 设置编码格式，打包的时候遇到问题
    clear_before_run=True,
    default_size=(800, 600),  # starting size of the GUI
    progress_regex=r"^progress: (\d+)%$"  # 正则，用于模式化运行时进度信息
)
def main():
    software_version = "1.0.0"
    settings_msg = '本工具旨在提高日常办公效率。欢迎提交建议意见，谢谢。作者微信号' + str(base64.b64decode('dHVsaW55aW5nMDE='),
                                                           encoding="utf-8") + "\nVersion：" + software_version
    parser = GooeyParser(description=settings_msg)  # 添加上方的应用信息

    subs = parser.add_subparsers(help='commands', dest='command')

    """
            批量excel中寻找指定字符串界面
            """
    find_str_parser = subs.add_parser('批量excel中寻找指定文本')
    find_str_parser.add_argument("to_be_found_dir", metavar='EXCEL所在目录', widget="DirChooser",
                                 help="请在这里选择待筛选excel所在目录，本工具将查找该目录及其所有子孙目录，找出待筛选目标文本，查找时请关闭该目录下所有excel，查找文件后缀为xlsx、xls、xlsm")
    find_str_parser.add_argument("target_str", metavar='待查找文本', widget="TextField", help="本工具查找时忽略大小写")

    """
    合并excel界面
    """
    combine_excel_parser = subs.add_parser('合并excel')
    # 需增加一下帮助指引文字
    combine_excel_parser.add_argument("to_be_combined_dir", metavar='待合并EXCEL所在目录', widget="DirChooser",
                                      help="注意：请将所有待合并excel放在该目录下，开始合并时请不要打开待合并excel。\n仅支持xlsx")
    combine_excel_parser.add_argument("combined_sheets", metavar='待合并的sheet', widget="TextField",
                                      default="作业流管控定义|作业流调度定义|作业流调度依赖定义(全量，如有必填)|作业管控定义|作业调度定义|作业调度依赖信息（全量，如有必填）",
                                      help="如需合并多个sheet，请按如下示例填写：\nsheet1|sheet2|sheet3 注：此处默认值为作者单位ETL工作涉及excel里的sheet名。大家需按需更改。")
    combine_excel_parser.add_argument("start_row", metavar='真实数据起始行', widget="TextField", default=4, type=int,
                                      help="非表头真实数据起始行，目前版本暂只支持所有sheet从同一行开始获取真实数据。",
                                      gooey_options={  # NEW!
                                          'validator': {
                                              'test': 'user_input.isdigit()',
                                              'message': '请输入大于0的整数'
                                          }
                                      })
    # 可选参数，需带-
    combine_excel_parser.add_argument("-excel_only_header2", metavar='仅带表头的空excel', widget="FileChooser",
                                      help="可选。请准备好一个仅带表头的excel。这样可以生成带表头的excel。")

    """
    批量筛选管控作业名或作业流名
    """
    filter_excel_parser = subs.add_parser('批量筛选管控作业名或作业流名')
    filter_excel_parser.add_argument("to_be_filtered_excel", metavar='待筛选excel', widget="FileChooser",
                                     help="注：此筛选功能针对我司ETL工作特殊定制。\n仅支持xlsx\n关于批量筛选，亦可参考文章http://www.tonull.cn/?p=173")
    filter_excel_parser.add_argument("filter_object", metavar='待筛选作业名或作业流名', widget="TextField",
                                     help="如有多个待筛值，请按如下示例填写：\njobname1|jobname2|jobname3")
    filter_excel_parser.add_argument("filter_object_type", metavar='按作业名筛选则写1，按作业流则写2', widget="TextField", default=1,
                                     type=int)
    filter_excel_parser.add_argument("-excel_only_header1", metavar='仅带表头的空excel', widget="FileChooser",
                                     help="可选。请准备好一个仅带表头的管控调度excel。这样可以生成带表头的excel。")
    # TODO这里本来是想用radio这种二义的控件的，但是不知道如何获取该类控件的值，所以放弃了改用TextField
    # verbosity = filter_excel_parser.add_mutually_exclusive_group("筛选目标类型")
    # verbosity.add_argument('-t', '--verbozze', dest='作业名',
    #                        action="store_true", help="筛选目标类型：作业名")
    # verbosity.add_argument('-q', '--quiet', dest='作业流名',
    #                        action="store_true", help="筛选目标类型：作业流名")

    """
    生成csv文件
    """
    csv_parser = subs.add_parser('生成csv文件')
    csv_parser.add_argument("csv_excel", metavar='待生成csv的excel文件', widget="FileChooser",
                            help="仅支持xlsx。转成csv这种文本类型文件之后，\n我们可以使用git等版本控制软件对其进行差异比较。")
    csv_parser.add_argument("csv_folder", metavar='用于存放csv的文件夹', widget="DirChooser",
                            help="请选择用于存放csv的文件夹。\n本工具会将指定excel的各sheet均生成单独的csv文件。")

    """
    程序功能实现
    """
    args = parser.parse_args()

    """对界面获得的数据进行处理"""

    if args.command == "批量excel中寻找指定文本":
        to_be_found_dir = args.to_be_found_dir
        target_str = args.target_str
        xiao_tool_server.find_in_excel_recursion(to_be_found_dir, target_str)
    elif args.command == "合并excel":
        to_be_combined_dir = args.to_be_combined_dir
        combined_sheets = args.combined_sheets
        start_row = args.start_row
        excel_only_header2 = args.excel_only_header2
        xiao_tool_server.combine_excel(to_be_combined_dir, combined_sheets, start_row, excel_only_header2)
    elif args.command == "批量筛选管控作业名或作业流名":
        to_be_filtered_excel = args.to_be_filtered_excel
        filter_object = args.filter_object
        filter_object_type = args.filter_object_type
        excel_only_header1 = args.excel_only_header1
        if filter_object_type == 1:
            xiao_tool_server.filter_by_job(to_be_filtered_excel, filter_object, excel_only_header1)
        else:
            xiao_tool_server.filter_by_jobflow(to_be_filtered_excel, filter_object, excel_only_header1)
    elif args.command == "生成csv文件":
        csv_excel = args.csv_excel
        csv_folder = args.csv_folder
        xiao_tool_server.generate_csv(csv_excel, csv_folder)
    else:
        print("非常感谢您的使用，期待您的下次使用。再见！")
        time.sleep(1)
        return


if __name__ == '__main__':
    main()
